#pragma once
#include <string>
#include <unordered_map>

/*
    常见字段
    宏替换
*/
namespace rpc
{
#define KEY_METHOD "method"
#define KEY_PARAMS "parameters"
#define KEY_TOPIC_KEY "topic_key"
#define KEY_TOPIC_MSG "topic_msg"
#define KEY_OPTYPE "optype"
#define KEY_HOST "host"
#define KEY_HOST_IP "ip"
#define KEY_HOST_PORT "port"
#define KEY_RCODE "rcode"
#define KEY_RESULT "result"

    enum class MType
    {
        REQ_RPC = 0,
        RSP_RPC,
        REQ_TOPIC,
        RSP_TOPIC,
        REQ_SERVICE,
        RSP_SERVICE
    };

    // 返回响应码
    enum class RCode
    {
        RCODE_OK = 0,
        RCODE_PARSE_FAILED,
        RCODE_ERROR_MSGTYPE,
        RCODE_INVALID_MSG,
        RCODE_DISCONNECTED,
        RCODE_INVALID_PARAMS,
        RCODE_NOT_FOUND_SERVICE,
        RCODE_INVALID_OPTYPE,
        RCODE_NOT_FOUND_TOPIC,
        RCODE_INTERNAL_ERROR
    };
    static std::string errReason(RCode code)
    {
        switch (code)
        {
        case RCode::RCODE_OK:
            return "成功处理！";
        case RCode::RCODE_PARSE_FAILED:
            return "消息解析失败！";
        case RCode::RCODE_ERROR_MSGTYPE:
            return "消息类型错误！";
        case RCode::RCODE_INVALID_MSG:
            return "无效消息";
        case RCode::RCODE_DISCONNECTED:
            return "连接已断开！";
        case RCode::RCODE_INVALID_PARAMS:
            return "无效的Rpc参数！";
        case RCode::RCODE_NOT_FOUND_SERVICE:
            return "没有找到对应的服务！";
        case RCode::RCODE_INVALID_OPTYPE:
            return "无效的操作类型";
        case RCode::RCODE_NOT_FOUND_TOPIC:
            return "没有找到对应的主题！";
        case RCode::RCODE_INTERNAL_ERROR:
            return "内部错误！";
        default:
            return "未知错误！";
        }
    }

    enum class RType
    {
        REQ_ASYNC = 0,
        REQ_CALLBACK
    };

    enum class TopicOptype
    {
        TOPIC_CREATE = 0, // 主题创建
        TOPIC_REMOVE,     // 主题销毁
        TOPIC_SUBSCRIBE,  // 主题订阅
        TOPIC_CANCEL,     // 主题取消订阅
        TOPIC_PUBLISH     // 主题发布
    };

    enum class ServiceOptype
    {
        SERVICE_REGISTRY = 0, // 服务注册
        SERVICE_DISCOVERY,    // 服务发现
        SERVICE_ONLINE,       // 服务上线
        SERVICE_OFFLINE,      // 服务下线
        SERVICE_UNKNOW        // 未知服务
    };
}